home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 60 / IOPROG_60.ISO / soft / c++ / gsl-1.1.1-setup.exe / {app} / include / gsl / gsl_chebyshev.h < prev    next >
Encoding:
C/C++ Source or Header  |  2002-04-20  |  4.2 KB  |  129 lines

  1. /* cheb/gsl_chebyshev.h
  2.  * 
  3.  * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
  4.  * 
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or (at
  8.  * your option) any later version.
  9.  * 
  10.  * This program is distributed in the hope that it will be useful, but
  11.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * General Public License for more details.
  14.  * 
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19.  
  20. #ifndef __GSL_CHEBYSHEV_H__
  21. #define __GSL_CHEBYSHEV_H__
  22.  
  23. #include <gsl/gsl_mode.h>
  24.  
  25. #undef __BEGIN_DECLS
  26. #undef __END_DECLS
  27. #ifdef __cplusplus
  28. # define __BEGIN_DECLS extern "C" {
  29. # define __END_DECLS }
  30. #else
  31. # define __BEGIN_DECLS /* empty */
  32. # define __END_DECLS /* empty */
  33. #endif
  34.  
  35. __BEGIN_DECLS
  36.  
  37.  
  38. /* data for a Chebyshev series over a given interval */
  39.  
  40. struct gsl_cheb_series_struct {
  41.  
  42.   double * c;   /* coefficients                */
  43.   size_t order; /* order of expansion          */
  44.   double a;     /* lower interval point        */
  45.   double b;     /* upper interval point        */
  46.  
  47.   /* The following exists (mostly) for the benefit
  48.    * of the implementation. It is an effective single
  49.    * precision order, for use in single precision
  50.    * evaluation. Users can use it if they like, but
  51.    * only they know how to calculate it, since it is
  52.    * specific to the approximated function. By default,
  53.    * order_sp = order.
  54.    * It is used explicitly only by the gsl_cheb_eval_mode
  55.    * functions, which are not meant for casual use.
  56.    */
  57.   size_t order_sp;
  58.  
  59.   /* Additional elements not used by specfunc */
  60.  
  61.   double * f;   /* function evaluated at chebyschev points  */
  62. };
  63. typedef struct gsl_cheb_series_struct gsl_cheb_series;
  64.  
  65.  
  66. /* Calculate a Chebyshev series of specified order over
  67.  * a specified interval, for a given function.
  68.  * Return 0 on failure.
  69.  */
  70. gsl_cheb_series * gsl_cheb_alloc(const size_t order);
  71.  
  72. /* Free a Chebyshev series previously calculated with gsl_cheb_alloc().
  73.  */
  74. void gsl_cheb_free(gsl_cheb_series * cs);
  75.  
  76. /* Calculate a Chebyshev series using the storage provided.
  77.  * Uses the interval (a,b) and the order with which it
  78.  * was initially created.
  79.  *
  80.  */
  81. int gsl_cheb_init(gsl_cheb_series * cs, const gsl_function * func,
  82.                   const double a, const double b);
  83.  
  84.  
  85. /* Evaluate a Chebyshev series at a given point.
  86.  * No errors can occur for a struct obtained from gsl_cheb_new().
  87.  */
  88. double gsl_cheb_eval(const gsl_cheb_series * cs, const double x);
  89. int gsl_cheb_eval_err(const gsl_cheb_series * cs, const double x, 
  90.                       double * result, double * abserr);
  91.  
  92.  
  93. /* Evaluate a Chebyshev series at a given point, to (at most) the given order.
  94.  * No errors can occur for a struct obtained from gsl_cheb_new().
  95.  */
  96. double gsl_cheb_eval_n(const gsl_cheb_series * cs, const size_t order, 
  97.                        const double x);
  98. int gsl_cheb_eval_n_err(const gsl_cheb_series * cs, const size_t order, 
  99.                         const double x, double * result, double * abserr);
  100.  
  101.  
  102. /* Evaluate a Chebyshev series at a given point, using the default
  103.  * order for double precision mode(s) and the single precision
  104.  * order for other modes.
  105.  * No errors can occur for a struct obtained from gsl_cheb_new().
  106.  */
  107. double gsl_cheb_eval_mode(const gsl_cheb_series * cs, double x, gsl_mode_t mode);
  108. int gsl_cheb_eval_mode_e(const gsl_cheb_series * cs, const double x, gsl_mode_t mode, double * result, double * abserr);
  109.  
  110.  
  111.  
  112. /* Compute the derivative of a Chebyshev series.
  113.  */
  114. int gsl_cheb_calc_deriv(gsl_cheb_series * deriv, const gsl_cheb_series * cs);
  115.  
  116. /* Compute the integral of a Chebyshev series. The
  117.  * integral is fixed by the condition that it equals zero at
  118.  * the left end-point, ie it is precisely
  119.  *       Integrate[cs(t; a,b), {t, a, x}]
  120.  */
  121. int gsl_cheb_calc_integ(gsl_cheb_series * integ, const gsl_cheb_series * cs);
  122.  
  123.  
  124.  
  125.  
  126. __END_DECLS
  127.  
  128. #endif /* __GSL_CHEBYSHEV_H__ */
  129.